package com.dhecp.project.flowable.service;

import com.dhecp.common.core.domain.AjaxResult;
import com.dhecp.project.flowable.domain.*;
import com.dhecp.project.system.domain.SysUserInfoSimple;
import org.flowable.bpmn.model.FlowElement;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.Task;

import java.util.List;
import java.util.Map;

/**
 * @InterfaceName ActProcessTaskService
 * @Description TODO
 * @Author alula
 * @Date 2020-03-31 17:21
 */
public interface ActProcessTaskService {
    /**
     * @param params
     * @return 查询待办中的流程任务
     */
    List<ActRuntimeTask> queryTodoActRuntimeTask(Map<String, Object> params);

    /**
     * @param params
     * @return 查询已办中的流程任务
     */
    List<ActHistoricTask> queryDoneActHistoricTask(Map<String, Object> params);

    /**
     * 根据数据表ID获取自定义流程实例
     * @param tableDataId
     * @return
     */
    SysProcessInstance querySysProcessInstanceByTableDataId(String tableDataId);

    /**
     * 获取任务对象
     * @param taskId
     * @return
     */
    Task queryTaskById(String taskId);

    /**
     * 根据实例ID获到实例
     * @param instId
     * @return
     */
    ProcessInstance queryProcessInstanceByInstId(String instId);

    /**
     * 获取当前任务上一个环节对象
     * @param taskId
     * @param activityId
     * @return
     */
    FlowElement queryCurrentTaskPrevActivity(String taskId, String currActId);


    /**
     * 获取当前任务下一个环节对象
     * @param taskId
     * @return
     */
    FlowElement queryCurrentTaskNextActivity(String taskId);

    /**
     * 根据任务实例与环节ID获取环节执行人
     * @param proInsId
     * @param prevActivity
     * @return
     */
    List<SysUserInfoSimple> queryPrevTaskCandidateUsers(String proInsId, FlowElement prevActivity);


    /**
     * 根据环节对象配置的表达式查询环节执行人
     * @param procDefId
     * @param taskId
     * @param nextActivity
     * @param isParallelGatewayInnerUserTask
     * @return
     */
    List<SysUserInfoSimple> queryNextTaskCandidateUsers(String procDefId, String taskId, FlowElement nextActivity, boolean isParallelGatewayInnerUserTask);

    /**
     * 查询用户当前实例下可以执行的任务数量
     * @param proInsId
     * @param userId
     * @return
     */
    int queryUserCurrentInstanceRunTaskCount(String proInsId, String userId);

    /**
     * 根据实例与候选人查询运行中的任务
     * @param proInsId
     * @param userId
     * @return
     */
    Task  queryUserCurrentInstanceRunTask(String proInsId, String userId);

    /**
     * 根据当前流程定义ID与环节ID，获取环节地象
     * @param proDefId
     * @param activityId
     * @return
     */
    FlowElement queryActivitiImplByProDefIdandActId(String proDefId, String activityId);

    /**
     * 根据实例ID获取可以驳回的环节信息
     * @param proInsId
     * @return
     */
    List<ActSimpleActivity> queryRejectActivityList(String proDefId, String proInsId, String taskId, String currActId);


    /**
     * 获取当前用户待办任务数量
     * @return
     */
    long queryCurrentUserTodoActRuntimeTaskCount(int filterEcpTask);

    /**
     * 通过流程
     * @param taskId
     * @param priority
     * @param comment
     * @param assignees
     * @param variables
     * @param medium
     * @return
     */
    AjaxResult passProcess(String taskId, Integer priority, String comment, List<String> assignees, Map<String, Object> variables, String medium, String softType);

    /**
     * 批量通过流程
     * @param taskIds
     * @param priority
     * @param comment
     * @param medium
     * @return
     */
    AjaxResult passAllProcess(String[] taskIds, Integer priority, String comment, String medium);

    /**
     * 回退流程
     * @param taskId 当前任务ID
     * @param comment 审批意见
     * @param variables 流程存储参数
     * @return
     */
    AjaxResult backProcess(String taskId, Integer priority, String comment, List<String> assignees, Map<String, Object> variables, String medium, String softType);

    /**
     * 批量回退流程
     * @param taskIds
     * @param priority
     * @param comment
     * @param medium
     * @return
     */
    AjaxResult backAllProcess(String[] taskIds, Integer priority, String comment, String medium);

    /**
     * 置回退流程
      * @param nid
     * @param activityId
     * @param priority
     * @param medium
     * @return
     */
    AjaxResult resetBackProcess(String nid, String activityId,Integer priority, String comment, List<String> assignees,String medium, String softType);

    /**
     * 驳回流程
     * @param taskId 当前任务ID
     * @param comment 审批意见
     * @param activityId 驳回节点ID
     * @param variables 流程存储参数
     * @return
     */
    AjaxResult rejectProcess(String taskId, String activityId, Integer priority, String comment, List<String> assignees, Map<String, Object> variables, String medium, String softType);

    /**
     * 中止流程
     * @param taskId 当前任务ID
     * @param comment 审批意见
     * @return
     */
    AjaxResult endProcess(String taskId, String comment) ;

    /**
     * 会签(加签)流程
     * @param taskId 当前任务ID
     * @param users 会签用户组
     * @return
     */
    AjaxResult jointProcess(String taskId, List<String> users);

    /**
     * 转办流程
     * @param taskId 当前任务ID
     * @param userId 转办人
     * @return
     */
    AjaxResult transferProcess(String taskId, String userId) ;

    /**
     * 委托代办流程
     * @param taskId 当前任务ID
     * @param userId 委托人
     * @param comment 审批意见
     * @return
     */
    AjaxResult delegateProcess(String taskId, String userId, String comment);

    /**
     * 根据业务表单NID获取当前任务所在的环节名称
     * @param nid
     * @return
     */
    String queryActivitiImplNameByNid(String nid);

    /**
     * 判断是否会签.
     */
    boolean isMultiInstance(FlowElement flowElement);

    /**
     * 判断某个UserTask是否是网关内的用户节点
     * @param procDefId
     * @param activityId
     * @return
     */
    boolean isParallelGatewayInnerUserTask(String procDefId, String activityId);

    /**
     * 是否能流程回退操作
     * @param nid
     * @param curUserId
     * @return
     */
    boolean isCanProcessEndBack(String nid, String curUserId);

    /**
     * 	绑定企业微信且存在待办任务未发送的用户（排除一分钟内活跃用户）
     * @return
     */
    List<Map<String, Object>> queryUserWithWeChatId();

    /**
     *	更新待办任务推送企业微信通知标志
     * @param idList
     * @return
     */
    AjaxResult updateTaskWxSendFlag(List<String> idList);
}
